home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Online / SpeakFreely / src / lpc10 / decode.c < prev    next >
C/C++ Source or Header  |  2000-05-18  |  7KB  |  284 lines

  1. /******************************************************************
  2. *
  3. *    DECODE Version 52
  4. *
  5. ******************************************************************
  6. *
  7. *   This subroutine provides error correction and decoding
  8. *   for all LPC parameters
  9. *
  10. * INPUTS:
  11. *  ORDER  - Number of RC's
  12. *  IPITV  - Index value of pitch
  13. *  IRMS   - Coded Energy
  14. *  IRC    - Coded Reflection Coefficients
  15. *  CORRP  - Error correction:
  16. *    If FALSE, parameters are decoded directly with no delay.  If TRUE,
  17. *    most important parameter bits are protected by Hamming code and
  18. *    median smoothed.  This requires an additional frame of delay.
  19. * OUTPUTS:
  20. *  VOICE  - Half frame voicing decisions
  21. *  PITCH  - Decoded pitch
  22. *  RMS    - Energy
  23. *  RC     - Reflection coefficients
  24. *
  25. *  NOTE: Zero RC's should be done more directly, but this would affect
  26. *   coded parameter printout.
  27. */
  28.  
  29.  
  30. #include "config.ch"
  31. #include "lpcdefs.h"
  32. #include <math.h>
  33.  
  34. /*int rmst[64]={1024,936,856,784,718,656,600,550,
  35.           502,460,420,384,352,328,294,270,
  36.           246,226,206,188,172,158,144,132,
  37.           120,110,102,92,84,78,70,64,
  38.           60,54,50,46,42,38,34,32,
  39.           30,26,24,22,20,18,17,16,
  40.           15,14,13,12,11,10,9,8,
  41.           7,6,5,4,3,2,1,0};
  42. **** -- this is defined in encode.c also  */
  43. extern int rmst[64];
  44.  
  45. int ivtab[32] ={
  46.  24960,24960,24960,24960, 25480,25480, 25483, 25480,
  47.        16640, 1560,1560,1560, 16640, 1816, 1563,
  48.        1560, 24960,24960, 24859, 24856, 26001,
  49.        25881, 25915, 25913, 1560,1560, 7800,
  50.        3640, 1561,1561, 3643, 3641 
  51. };
  52. float corth[4][8]={
  53. 32767.,32767.,32.,32.,32.,32.,16.,16.,
  54. 10.,8.,6.4,6.4,11.2,11.2,5.6,5.6,
  55. 5.,4.,3.2,3.2,6.4,6.4,3.2,3.2,
  56. 0., 0.,0.,0.,0.,0.,0.,0.
  57. };
  58. int detau[128]={
  59.  0,0,0,3,0,3,3,31, 0,3,3,21,3,3,29,30,
  60.            0,3,3,20,3,25,27,26, 3,23,58,22,3,24,28,3,
  61.         0,3,3,3,3,39,33,32, 3,37,35,36,3,38,34,3,
  62.            3,42,46,44,50,40,48,3, 54,3,56,3,52,3,3,1,
  63.         0,3,3,108,3,78,100,104, 3,84,92,88,156,80,96,3,
  64.         3,74,70,72,66,76,68,3, 62,3,60,3,64,3,3,1,
  65.         3,116,132,112,148,152,3,3, 140,3,136,3,144,3,3,1,
  66.            124,120,128,3,3,3,3,1, 3,3,3,1,3,1,1,1
  67. };
  68. int detab7[32]={
  69. 4,11,18,25,32,39,46,53,60,66,72,77,82,87,92,96,101,
  70.          104,108,111,114,115,117,119,121,122,123,124,125,126,
  71.          127,127
  72. };
  73. float descl[8]={.6953,.6250,.5781,.5469,.5312,.5391,.4688,.3828};
  74. int deadd[8]={1152,-2816,-1536,-3584,-1280,-2432,768,-1920};
  75. int qb[8]={511,511,1023,1023,1023,1023,2047,4095};
  76. int nbit[10]={8,8,5,5,4,4,4,4,3,2};
  77. int zrc[MAXORD]={0,0,0,0,0,3,0,2,0,0};
  78. int abit[5]={2,4,8,16,32};
  79.  
  80. extern int drc[3][MAXORD], dpit[3], drms[3];
  81.  
  82. decode(ipitv, irms, irc, voice, pitch, rms, rc )
  83. int ipitv, *irms, irc[MAXORD];
  84. int voice[2], *pitch;
  85. float *rms, rc[ORDER];
  86. {
  87. int ivoic;
  88. static int ivp2h=0, erate=0, iovoic=0;
  89. int i, i1, i2, i4, iavgp=60, icorf,index, iout;
  90. int ipit, ishift, ixcor, lsb, median();
  91. int errcnt;
  92. int ethrs=2048, ethrs1=128, ethrs2=1024, ethrs3=2048;
  93. int fut=0, pres=1, past=2;
  94. float ftemp;
  95. int itemp;
  96. static short first=1;
  97.  
  98. /*  If no error correction, do pitch and voicing then jump to decode    */
  99.  
  100. i4 = detau[ipitv];
  101.  
  102. /*  Do error correction pitch and voicing    */
  103.  
  104.     if(i4>4) {
  105.         dpit[fut] = i4;
  106.         ivoic = 2;
  107.         iavgp = (15*iavgp+i4+8)*0.0625;
  108.     }
  109.     else    {
  110.         ivoic = i4;
  111.         dpit[fut] = iavgp;
  112.     }
  113.     drms[fut] = *irms;
  114.  
  115.     for(i=1;i<=ORDER;i++)
  116.         drc[fut][i-1] = irc[i];
  117.  
  118. /*  Determine index to IVTAB from V/UV decision
  119. *  If error rate is high then use alternate table    */
  120.  
  121.     index = 16*ivp2h + 4*iovoic + ivoic + 1;
  122.     i1 = ivtab[index-1];
  123.     ipit = i1&3;
  124.     icorf = i1*0.125;
  125.     if(erate<ethrs) icorf *= 0.015625;
  126.  
  127. /*  Determine error rate:  4=high    1=low    */
  128.  
  129.     ixcor = 4;
  130.     if(erate<ethrs3) ixcor = 3;
  131.     if(erate<ethrs2) ixcor = 2;
  132.     if(erate<ethrs1) ixcor = 1;
  133.  
  134. /*  Voice/unvoice decision determined from bits 0 and 1 of IVTAB    */
  135.  
  136.     voice[1] = (int)(icorf*0.5)&1;
  137.     voice[2] = icorf&1;
  138.  
  139. /*  Skip decoding on first frame because present data not yet available    */
  140.  
  141.     if(first) 
  142.        first = 0;
  143.     else {
  144.  
  145. /*  If bit 4 of ICORF is set then correct RMS and RC(1) - RC(4).
  146. *    Determine error rate and correct errors using a Hamming 8,4 code
  147. *    during transition or unvoiced frame.  If IOUT is negative,
  148. *    more than 1 error occurred, use previous frame's parameters.    */
  149.  
  150.         if((icorf&abit[3])!=0) {
  151.             errcnt = 0;
  152.             lsb = drms[pres]&1;
  153.             index = drc[pres][7]*16 + drms[pres] * 0.5;
  154.             ham84(index,&iout,&errcnt);
  155.             drms[pres] = drms[past];
  156.             if(iout>=0) drms[pres] = iout*2 + lsb;
  157.  
  158.             for(i=1;i<=4;i++)    {
  159.                 if(i==1) 
  160.                     i1= (drc[pres][8]&7)*2+(drc[pres][9] &1);
  161.                       else
  162.                          i1  = drc[pres][8-i]&15;
  163.                       
  164.                       i2 = drc[pres][4-i]&31;
  165.                       lsb = i2&1;
  166.                       index = 16*i1 + i2*0.5;
  167.                       ham84(index,&iout,&errcnt);
  168.                       if(iout>=0) {
  169.                          iout = iout*2+lsb;
  170.                          if((iout&16)==16) 
  171.                         iout = iout-32;
  172.                 }
  173.                       else
  174.                          iout = drc[past][4-i];
  175.                       drc[pres][4-i] = iout;
  176.                }
  177.  
  178. /*  Determine error rate    */
  179.                erate = erate*.96875 + errcnt*102;
  180.         }
  181.  
  182. /*  Get unsmoothed RMS, RC's, and PITCH    */
  183.  
  184.     *irms = drms[pres];
  185.  
  186.     for(i=1;i<=ORDER;i++)
  187.        irc[i]= drc[pres][i-1];
  188.     if(ipit==1) dpit[pres] = dpit[past];
  189.     if(ipit==3) dpit[pres] = dpit[fut];
  190.     *pitch = dpit[pres];
  191.  
  192. /*  If bit 2 of ICORF is set then smooth RMS and RC's,    */
  193.  
  194.     if(icorf&abit[1]!=0) {
  195.        if(  abs(drms[pres]-drms[fut]) >= corth[ixcor-1][1]
  196.               && abs(drms[pres]-drms[past]) >= corth[ixcor-1][1]  )
  197.             *irms = median( drms[past], drms[pres], drms[fut] );
  198.  
  199.        for(i=1;i<=6;i++)    
  200.         if(  abs(drc[pres][i-1]-drc[fut][i-1]) >= corth[ixcor-1][i+1]
  201.            &&abs(drc[pres][i-1]-drc[past][i-1])>= corth[ixcor-1][i+1])
  202.                    irc[i]= median( drc[past][i-1], drc[pres][i-1],drc[fut][i-1]);
  203.     }
  204.  
  205. /*  If bit 3 of ICORF is set then smooth pitch    */
  206.  
  207.     if(icorf&abit[2]!=0) {
  208.        if(abs(dpit[pres]-dpit[fut]) >= corth[ixcor-1][0]
  209.              &&abs(dpit[pres]-dpit[past])>= corth[ixcor-1][0])
  210.                *pitch = median( dpit[past], dpit[pres], dpit[fut] );
  211.     }
  212.  
  213. /*  If bit 5 of ICORF is set then RC(5) - RC(10) are loaded with
  214. *  values so that after quantization bias is removed in decode
  215. *  the values will be zero.    */
  216. } /* end if first */
  217.     if((icorf&abit[4])!=0) 
  218.         for(i=5;i<=ORDER;i++)
  219.                   irc[i]= zrc[i-1];
  220.        
  221.     
  222.  
  223. /*  House keeping  - one frame delay    */
  224.  
  225.     iovoic = ivoic;
  226.     ivp2h = voice[2];
  227.     dpit[past] = dpit[pres];
  228.     dpit[pres] = dpit[fut];
  229.     drms[past] = drms[pres];
  230.     drms[pres] = drms[fut];
  231.  
  232.     for(i=1;i<=ORDER;i++)    {
  233.        drc[past][i-1] = drc[pres][i-1];
  234.        drc[pres][i-1] = drc[fut][i-1];
  235.     }
  236.  
  237. /*   Decode RMS    */
  238.  
  239.     *irms = rmst[(31-*irms)*2];    
  240.  
  241. /*  Decode RC(1) and RC(2) from log-area-ratios
  242. *  Protect from illegal coded value (-16) caused by bit errors    */
  243.  
  244.     for(i=1;i<=2;i++)    {
  245.        i2 = irc[i];
  246.        i1 = 0;
  247.        if(i2<0) {
  248.           i1 = 1;
  249.           i2 = -i2;
  250.           if(i2>15) i2 = 0;
  251.        }
  252.        i2 = detab7[2*i2];
  253.        if(i1==1) i2 = -i2;
  254.        ishift = 15 - nbit[i-1];
  255. /*       irc[i]= i2*pow(2.0,(float)ishift); */
  256.        irc[i] = i2*(2<<(ishift-1));
  257.     }
  258.  
  259. /*  Decode RC(3)-RC(10) to sign plus 14 bits    */
  260.  
  261.     for(i=3;i<=ORDER;i++)    {
  262.        i2 = irc[i];
  263.        ishift = 15 - nbit[i-1];
  264. /*       i2 = i2*pow(2.0,(float)ishift);  */
  265.        i2 = i2*(2<<(ishift-1));
  266.        i2 += qb[i-3];
  267.        ftemp = i2*descl[i-3] + deadd[i-3];    /* rounding problem */
  268.        if(ftemp < 0)    {
  269.         ftemp = - ftemp;
  270.           itemp = ftemp;
  271.          irc[i] = -itemp;
  272.        }
  273.        else
  274.         irc[i] = ftemp;
  275.     }
  276.  
  277. /*  Scale RMS and RC's to reals    */
  278.  
  279.     *rms = *irms;
  280.     for(i=1;i<=ORDER;i++)
  281.        rc[i]= (float)(irc[i]* 6.103515625e-05);  /* 16,384 = 2**14  */
  282.  
  283. }
  284.